int goFacet=-1;
boolean rotLoc=true;
boolean rotLim=false;


/* control environement variables */
int FlowerState=0;
boolean facetVSpod=true;
boolean setFrame=false;
boolean recordMode=false;
int goMode=3; //direct,run,sim
int podSelected=-1;
int facetSelected=0;
int pFrame;  //active program frame
String l_program="-";
float speedMult=1;
int target=0;
boolean flowerVis=false;

void InitPad() {
  oscEcho(0, 0, 0); //clear
  PadSetup();
}

void ZeroControlVariables() {
  InitSeed();
  FlowerState=0;
  FlowerVis(false);
  speedMult=1;
  facetVSpod=true;
  podSelected=-1;
  facetSelected=0;
  l_program="-";
  pFrame=0;
  goMode=3;
  setFrame=false;
  recordMode=false;
}

void SetToggle(String ctrl, float togVal) {
  echoMsg=new OscMessage("/"+ctrl);
  echoMsg.add(togVal);
  SendMSG(0, echoMsg, false);
}

void FlowerVis(boolean setIt) {
  flowerVis=setIt;
  echoMsg=new OscMessage("/FlowerState/visible");
  echoMsg.add(setIt);
  SendMSG(0, echoMsg, false);  
  for (int i=1;i<17;i++) {
    echoMsg=new OscMessage("/l_flowerstate/1/"+i+"/visible");
    echoMsg.add(setIt);
    SendMSG(0, echoMsg, false);
  }
}
void SetRecordMode() {
  echoMsg=new OscMessage("/RecordMode");
  echoMsg.add(recordMode);
  SendMSG(0, echoMsg, false);
}

void SetFrameButton() {
  echoMsg = new OscMessage("/l_setframe/visible");
  echoMsg.add(setFrame);
  SendMSG(0, echoMsg, false);
  echoMsg = new OscMessage("/SetFrame/visible");
  echoMsg.add(setFrame);
  SendMSG(0, echoMsg, false);
}

void ToggleVS() {
  String addMsg="facet";

  if (!facetVSpod) {
    addMsg="POD";
    PodButtons();
  } else {
    FacetButtons();
  }
  statMsg = "Change to "+addMsg;
  println(statMsg);
  echoMsg = new OscMessage("/l_facetvspod");
  echoMsg.add(addMsg);
  SendMSG(0, echoMsg, false);
}

void rotCTRLs() {
  echoMsg=new OscMessage("/MAIN/degree/visible");
  echoMsg.add(int(!rotLoc));
  SendMSG(0, echoMsg, true);
  echoMsg=new OscMessage("/MAIN/spinDirect/visible");
  echoMsg.add(int(!rotLoc));
  SendMSG(0, echoMsg, true);
  echoMsg=new OscMessage("/MAIN/rotZero/visible");
  echoMsg.add(int(!rotLoc));
  SendMSG(0, echoMsg, true);
}

void oscRotZero() {
  echoMsg=new OscMessage("/MAIN/spinDirect");
  echoMsg.add("0");
  SendMSG(0, echoMsg, true);
  if (goFacet==100) {
    echoMsg=new OscMessage("/PLAN/degree");
  } else {
    echoMsg=new OscMessage("/MAIN/degree");
  }
  echoMsg.add("0");
  SendMSG(0, echoMsg, true);
  oscRot=0;
}

void RotCTRLs() {
  echoMsg=new OscMessage("/MAIN/degree/visible");
  echoMsg.add(int(!rotLoc));
  SendMSG(0, echoMsg, true);
  echoMsg=new OscMessage("/MAIN/spinDirect/visible");
  echoMsg.add(int(!rotLoc));
  SendMSG(0, echoMsg, true);
  echoMsg=new OscMessage("/MAIN/rotZero/visible");
  echoMsg.add(int(!rotLoc));
  SendMSG(0, echoMsg, true);
}

void PadSetup() {
  facetVSpod=true;
  oscRotZero();
  RotCTRLs();
  echoMsg=new OscMessage("/MAIN/spinDirect");
  echoMsg.add("0");
  SendMSG(0, echoMsg, false);
  oscRot=0;
  //  positionWindow(5, 0);
  rotLoc=true;
  rotLim=true;
  RotCTRLs();
  echoMsg=new OscMessage("/MAIN/degree/visible");
  echoMsg.add("0");
  SendMSG(0, echoMsg, false);
  echoMsg=new OscMessage("/MAIN/rotLoc");
  echoMsg.add("1.0");
  SendMSG(0, echoMsg, true);
  echoMsg=new OscMessage("/MAIN/rotLim");
  echoMsg.add("1");
  SendMSG(0, echoMsg, true);
  FacetButtons();
}

void Set1DFader(String faderName, float faderValue, String setColor, boolean visible, String label) {

  echoMsg = new OscMessage("/"+faderName);  
  echoMsg.add(faderValue);
  SendMSG(0, echoMsg, false);
  echoMsg = new OscMessage("/l_"+faderName.toLowerCase());
  echoMsg.add(label);
  SendMSG(0, echoMsg, false);
}
void Set1DToggle(String togName, boolean isHorizontal, int start, int end, int index, String setColor, 
int visible, boolean updateValue) {
  String echoPrefix="/"+togName+"/";
  String echoSuffix="";
  String echoSum="";
  float state;
  boolean setVis=false; //but don't use unless int visible != -1
  if (visible==1) {
    setVis=true;
  }
  if (isHorizontal) {
    echoPrefix+="1/";
  } else {
    echoSuffix="/1";
  }
  if (updateValue||visible!=-1) {
    for (int i=start;i<=end;i++) {
      echoSum= echoPrefix+i+echoSuffix;
      if (updateValue) {
        echoMsg = new OscMessage(echoSum);
        if (i==index) {//set only one switch on, at most
          state=1.0;
        } else {
          state=0.0;
        }
        echoMsg.add(state);
        SendMSG(0, echoMsg, false);
      }
      if (visible!=-1) {
        echoMsg= new OscMessage(echoSum+"/visible");
        echoMsg.add(setVis);
        SendMSG(0, echoMsg, false);
      }
    }
  }
  if (setColor!="") {
    echoMsg = new OscMessage(echoPrefix+"color");
    echoMsg.add(setColor);
    SendMSG(0, echoMsg, false);
  }
}

void GoButton() {
  l_program="-";
  String goColor="brown";
  if (goMode!=1) {
    if (facetSelected!=0) {
      if (facetVSpod) {
        l_program=facets[facetSelected][2];
      } else {  
        l_program=pods[podSelected][2];
      }
      if (goMode==3) {
        goColor="yellow";
        target=32768; //ok, hardcoded the flowerstate for sim mode; redundant though
      } else {
        if (FlowerState!=0) {
          goColor="green";
          target=FlowerState;
        }
      }
    }
  } else {
    l_program="*direct*";
  }
  echoMsg = new OscMessage ("/l_program");
  echoMsg.add(l_program);
  SendMSG(0, echoMsg, false);
  echoMsg = new OscMessage ("/GO/color");
  echoMsg.add(goColor);
  SendMSG(0, echoMsg, false);
  UpdateSeed(0, target);
  UpdateSeed(1, facetSelected);
}

void PodButtons() {
  String podName;

  Set1DToggle("SelectProgram", true, 1, 16, 0, "", -1, true);
  if (podSelected!=-1) {
    echoMsg = new OscMessage ("/SelectProgram/1/"+(podSelected));
    echoMsg.add(1.0);
    SendMSG(0, echoMsg, false);
    GoButton();
  }
  echoMsg = new OscMessage ("/SelectProgram/color");
  echoMsg.add("pink");
  SendMSG(0, echoMsg, false);
  for (int i =0; i<17; i++) {
    echoMsg= new OscMessage("/MAIN/FL"+i);
    if (i>=pRows) {
      podName="-";
    } else {
      podName=pods[i][0];
      println(podName);
    }
    echoMsg.add(podName);
    SendMSG(0, echoMsg, false);
    echoMsg= new OscMessage("/MAIN/FL"+i+"/color");
    echoMsg.add("yellow");
    SendMSG(0, echoMsg, false);
  }
}

void FacetButtons() {
  String facetName;

  Set1DToggle("SelectProgram", true, 1, 16, 0, "", -1, true);
  if (facetSelected!=0) {
    echoMsg = new OscMessage ("/SelectProgram/1/"+(facetSelected));
    echoMsg.add(1.0);
    SendMSG(0, echoMsg, false);
    GoButton();
  }
  echoMsg = new OscMessage ("/SelectProgram/color");
  echoMsg.add("green");
  SendMSG(0, echoMsg, false);
  for (int i =1; i<16; i++) {

    if (i>=fRows) {
      facetName="-";
    } else {
      facetName=facets[i][2];
      println(facetName);
      echoMsg= new OscMessage("/MAIN/FL"+i+"/color");
      if (facets[i][0].equals("seq")==true) {
        echoMsg.add("green");
        SendMSG(0, echoMsg, false);
      }
      if (facets[i][0].equals("img")==true) {
        echoMsg.add("blue");
        SendMSG(0, echoMsg, false);
      }
      if (facets[i][0].equals("proc")==true) {
        echoMsg.add("pink");
        SendMSG(0, echoMsg, false);
      }
      echoMsg= new OscMessage("/MAIN/FL"+i);
      echoMsg.add(facetName);
      SendMSG(0, echoMsg, false);
      
    }
  }
}
